//---------------------------------------------------------------------------

#ifndef DibujoDeLineasH
#define DibujoDeLineasH
#include <math.h>
#include <stdexcept.h>
#include "Lista.h"
#include "Segmento.h"
#include "XMlize.h"

const GLdouble PI=3.1415926535897931;
const GLint precision_circunferencia = 30;

class DibujoDeLineas : XMlize<DibujoDeLineas>{
private:
        Lista<Segmento> *_listaSegmentos;
        PV2D** _puntos_control;
        GLint _precision;
        int _cuantos_puntos;
        bool _terminado;
        bool _curva;
        bool _editando;
        bool _bezier;

        //poligonos
        GLdouble _xCentro;
        GLdouble _yCentro;
        GLdouble _lado;
        GLint _numLados;

        double berstein(double,int,int);
        double splines(double);
        int factorial(int);
        Lista<Segmento>* dibujaArco(GLdouble, GLdouble, GLdouble, GLdouble, GLdouble);
        
public:
        DibujoDeLineas();
        DibujoDeLineas(Lista<PV2D>*,GLint,bool);
        DibujoDeLineas(PV2D**,GLint,GLint,bool);
        DibujoDeLineas(GLdouble,GLdouble,GLdouble,GLint);
        ~DibujoDeLineas();
        void terminaDibujo();
        void uneSegmento(Segmento*);
        void pintaDibujo(bool);

        PV2D** getPuntos(){return _puntos_control;};
        int getCuantosPuntos(){return _cuantos_puntos;};
        void redibuja(int,double,double);

        AnsiString toXM();
        static DibujoDeLineas* fromXM(XM*);

        bool vacio();
        void recorta(GLdouble,GLdouble,GLdouble,GLdouble);

        inline bool estaTerminado(){return _terminado;};
        inline void editando(){_editando=true;};
        inline bool esCurva(){return _puntos_control!=NULL;};
        inline bool getEdicion(){return _editando;};
        inline void finEdicion(){_editando=false;};
};

//---------------------------------------------------------------------------
#endif
